package Traductor.lexico.utils;

/** Clase que modela los tokens que utiliza el analizador sintáctico para identificar las partes del programa.
 * Son creados por el analizador léxico.
 */
public class Token {
	public enum TipoToken {cabecera, iden, punto, declaraciones, instrucciones, puntoycoma, variable, tipo, asig,
						   menor, mayor, menorigual, mayorigual, igual, distinto, suma, resta, mult, div, mod, 
						   and, or, not, castReal, castNat, castEnt, castCar, parA, parC, tBool, tChar,
						   tNat, tEnt, tReal, insLee, insEsc, EOF, nat, ent, real, car, comment, dizq, dder, booleano,
						   dospuntos, unario, ERROR,
						   si, entonces, sino, finsi, llaveA, llaveC, obien, mientras, hacer, desde, hasta, vector,
						   corA, corC, de, registro, puntero, nulo, reserva, procedimiento, param, paramvar, asigtipo,
						   flecha, coma, libera; }
	
	private String lexema;
	private TipoToken tipo;
	private int linea;
	private int pos;
	
	/** Constructora de la clase Token
	 * @param tipo El tipo del token a crear
	 * @param lexema El contenido del token
	 */
	public Token(TipoToken tipo, String lexema){
		this.tipo = tipo;
		this.lexema = lexema;
	}	
	
	public int getLinea() {
		return linea+1;
	}

	public void setLinea(int linea) {
		this.linea = linea;
	}

	public int getPos() {
		return pos+1;
	}

	public void setPos(int pos) {
		this.pos = pos;
	}

	public String getLexema(){
		return lexema;
	}
	
	public TipoToken getTipo(){
		return this.tipo;
	}
	
	public void setTipo(TipoToken t){
		this.tipo=t;
	}
	
	@Override
	public String toString(){
		return "Token [lexema= " + lexema + ", tipo= " + tipo +" pos= {"+linea+","+pos+"}]";
	}
	
	/** Devuelve la posición del token respecto al programa original.
	 * @return La linea y la posicion dentro de la linea que ocupa el token en el programa.
	 */
	public String getPosicion(){
		return "{"+(linea+1)+","+(pos+1)+"}";
	}
}